        //是不是应该存为虚拟DOM文件?  
        const htmlText = app.innerHTML; 
 
              
        //副作用函数栈，存放所有副作用函数
        //修改[data->Map[name:Set(fn1,fn2...)],data2->Map[name:Set(fn1,fn2...)]]
        const e_stack = new WeakMap();  
        //正在执行的副作用函数
        let activeEffect = null;
        //判断是否是对象
        function isObject(value){
            return typeof value === 'object' && value !== null
        }
         
       //渲染页面
        function diff_run(text){
            // 正则 Reg 用于匹配 {{}}  
            let Reg = /\{\{(.*)\}\}/
            // Reg.test() 正则方法 判断是否符合正则规则
           
            while( Reg.test(text) ){
              //获取第一个括号的匹配结果
              let key = RegExp.$1.trim();
              //let arr = key.split('.');
              text = text.replace(Reg,data[key]);
            }
            app.innerHTML = text
  
        }
      
        //收集依赖
        function track(target,key){
          if(!activeEffect) return
          let depMap = e_stack.get(target);
          if(!depMap){
              depMap = new Map();
              e_stack.set(target,depMap)
          }

          let depSet = depMap.get(key);
          if(!depSet){
              depSet = new Set();
              depMap.set(key,depSet)
          }
          
          depSet.add(activeEffect)
        }
        
         //触发依赖
         function trigger(target,key){
             let depMap = e_stack.get(target);
             if(!depMap) return;
             
             let depSet = depMap.get(key)
             if(depSet)  depSet.forEach( fn=> fn())
         }
       
        /**
         * 创建响应式数据
         * @param [object]: 普通对象
         * @return [Proxy]: 代理对象
         */
        function reactive(obj){
          if(!isObject(obj)) return;
          
          return new Proxy(obj,{
            get(target,key){
              track(target,key)    //收集
              return target[key]
            },
            set(target,key,value){
              target[key] = value;
              trigger(target,key)  //触发依赖中的副作用函数
              return true;
            }
          })
        }
       
       /**
        * 注册副作用函数
        * @param [function]: 需要注册的副作用函数
        */
       function effect(fn){
         if(typeof fn !== 'function') return
         activeEffect = fn    //记录正在执行的副作用函数
         fn()                 //调用副作用函数         
         activeEffect = null  //重置全局变量
       }
       
